home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / telecom / 260 / keytable.s < prev    next >
Text File  |  1988-07-08  |  7KB  |  187 lines

  1. ; Message inbox:15 -  Read
  2. ; From:      <WACKER@CERNVM.cern>
  3. ; To:        "Mike Gerard CERN-DD (JMG AT CERNVAX)" <jmg@priam.cern>
  4. ; In-Reply-To: Your message of 12 Feb 88 15:56 +0100
  5. ;
  6. ; >X-Bitnet-Sender: Klaus Wacker <WACKER@CERNVM>
  7. ;
  8. ;
  9. ;
  10. ; change keyboard tables                Klaus Wacker
  11. ;
  12. ; This program first checks, whether the keyboard tables are already
  13. ; in RAM (address < 4 Mega).
  14. ;
  15. ; If they are not in ram, the tables contained in here are kept
  16. ; and installed using keytbl (xbios 16). Furthermore, code to
  17. ; intercept future bioskeys (xbios 24) calls is installed. Bioskeys
  18. ; is replaced by keytbl.
  19. ;
  20. ; If they are already in RAM, they are overwritten, but only the
  21. ; positions corresponding to "typewriter" keys, not the keypad and
  22. ; function keys. Thus, this program, or different versions of it,
  23. ; can be called several times in a session without eating up more
  24. ; and more space.
  25. ;
  26. gemdos: equ 1
  27. keep_process: equ $31
  28. ;
  29. bios:   equ 13
  30. xbios:  equ 14
  31. keytbl: equ 16
  32. bioskeys: equ 24
  33. supexec: equ 38
  34. ;
  35. xbiosvec: equ xbios+$20
  36. ;
  37.         section text
  38. start:  bra skip
  39. ;
  40. ;
  41. unshift:
  42. NORMALTBL:
  43.             dc.b $00,$1B,$31,$32,$33,$34,$35,$36 ; ..123456
  44.             dc.b $37,$38,$39,$30,$2D,$27,$08,$09 ; 7890-'..
  45.             dc.b $71,$77,$65,$72,$74,$79,$75,$69 ; qwertyui
  46.             dc.b $6F,$70,$40,$2B,$0D,$00,$61,$73 ; op@+..as
  47.             dc.b $64,$66,$67,$68,$6A,$6B,$6C,$5B ; dfghjkl(square bracket)
  48.             dc.b $5D,$23,$00,$7E,$7A,$78,$63,$76 ; ]#.^zxcv
  49.             dc.b $62,$6E,$6D,$2C,$2E,$2F,$00,$00 ; bnm,./..
  50.             dc.b $00,$20,$00,$00,$00,$00,$00,$00 ; . ......
  51.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  52.             dc.b $00,$00,$2D,$00,$00,$00,$2B,$00 ; ..-...+.
  53.             dc.b $00,$00,$00,$7F,$00,$00,$00,$00 ; ... ....
  54.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  55.             dc.b $3C,$00,$00,$28,$29,$2F,$2A,$37 ; <..()/*7
  56.             dc.b $38,$39,$34,$35,$36,$31,$32,$33 ; 89456123
  57.             dc.b $30,$2E,$0D,$00,$00,$00,$00,$00 ; 0.......
  58.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  59. shift:
  60. SHIFTTBL:
  61.             dc.b $00,$1B,$21,$22,$DD,$24,$25,$26 ; ..!"]$%&
  62.             dc.b $2D,$28,$29,$3D,$3F,$60,$08,$09 ; -()=?`..
  63.             dc.b $51,$57,$45,$52,$54,$59,$55,$49 ; QWERTYUI
  64.             dc.b $4F,$50,$5C,$2A,$0D,$00,$41,$53 ; OP\*..AS
  65.             dc.b $44,$46,$47,$48,$4A,$4B,$4C,$7B ; DFGHJKL{
  66.             dc.b $7D,$5E,$00,$7C,$5A,$58,$43,$56 ; }|.|ZXCV
  67.             dc.b $42,$4E,$4D,$3B,$3A,$5F,$00,$00 ; BNM;:_..
  68.             dc.b $00,$20,$00,$00,$00,$00,$00,$00 ; . ......
  69.             dc.b $00,$00,$00,$00,$00,$00,$00,$37 ; .......7
  70.             dc.b $38,$00,$2D,$34,$00,$36,$2B,$00 ; 8.-4.6+.
  71.             dc.b $32,$00,$30,$7F,$00,$00,$00,$00 ; 2.0 ....
  72.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  73.             dc.b $3E,$00,$00,$28,$29,$2F,$2A,$37 ; >..()/*7
  74.             dc.b $38,$39,$34,$35,$36,$31,$32,$33 ; 89456123
  75.             dc.b $30,$2E,$0D,$00,$00,$00,$00,$00 ; 0.......
  76.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  77. capsloc:
  78. CAPSLOCKTBL:
  79.             dc.b $00,$1B,$31,$32,$33,$34,$35,$36 ; ..123456
  80.             dc.b $37,$38,$39,$30,$2D,$27,$08,$09 ; 7890-'..
  81.             dc.b $51,$57,$45,$52,$54,$59,$55,$49 ; QWERTYUI
  82.             dc.b $4F,$50,$40,$2B,$0D,$00,$41,$53 ; OP@+..AS
  83.             dc.b $44,$46,$47,$48,$4A,$4B,$4C,$5B ; DFGHJKL(square bracket)
  84.             dc.b $5D,$23,$00,$7E,$5A,$58,$43,$56 ; ]#.^ZXCV
  85.             dc.b $42,$4E,$4D,$2C,$2E,$2F,$00,$00 ; BNM,./..
  86.             dc.b $00,$20,$00,$00,$00,$00,$00,$00 ; . ......
  87.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  88.             dc.b $00,$00,$2D,$00,$00,$00,$2B,$00 ; ..-...+.
  89.             dc.b $00,$00,$00,$7F,$00,$00,$00,$00 ; ... ....
  90.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  91.             dc.b $3C,$00,$00,$28,$29,$2F,$2A,$37 ; <..()/*7
  92.             dc.b $38,$39,$34,$35,$36,$31,$32,$33 ; 89456123
  93.             dc.b $30,$2E,$0D,$00,$00,$00,$00,$00 ; 0.......
  94.             dc.b $00,$00,$00,$00,$00,$00,$00,$00 ; ........
  95. ;
  96. ;       disable xbios(24)(bioskeys), replace it by xbios(16)(these keys).
  97. new_xbios:
  98.         btst    #5,(sp)        ;called from supervisor status?
  99.         bne.s   supcall         ;yes
  100.         move    usp,a0;          get user stack pointer
  101.         bra.s   nosup
  102. supcall: movea.l sp,a0          ;get supervisor stack pointer
  103.         addq.l  #6,a0           ;correct for pc and sr saved by trap
  104. nosup:  cmp.w   #bioskeys,(a0)  ;  check function if bioskeys
  105.         beq.s   hackbioskeys
  106. jmp:    jmp     $1234567        ;replaced by old xbios address by init
  107. oldxbios: equ   jmp+2
  108. ;
  109. hackbioskeys:
  110.         pea     capsloc(pc)     ;do keytbl instead
  111.         pea     shift(pc)
  112.         pea     unshift(pc)
  113.         move.w  #keytbl,-(sp)
  114.         trap    #xbios          ;call xbios recursively- hope this will work
  115.         add.l   #14,sp
  116.         rte                     ;back from trap
  117. ;
  118. ;*************************** end of resident part ***********************
  119. ;
  120. skip:
  121. ; get address of old table
  122.         moveq   #-1,d7
  123.         move.l  d7,-(sp)
  124.         move.l  d7,-(sp)
  125.         move.l  d7,-(sp)
  126.         move.w  #keytbl,-(sp)
  127.         trap    #xbios
  128.         add.l   #14,sp
  129. ; are the tables already in RAM?
  130.         move.l  d0,a4           ; get pointer to list of addresses
  131.         moveq   #3-1,d4         ; set loop for 3 128byte tables
  132. ;
  133. next_address:
  134.         move.l  (a4)+,a3        ; get next table adress
  135.         cmp.l   #$100000,a3     ;up to 4MB RAM
  136.         bgt.s   set_pointers
  137.         dbra    d4,next_address
  138. ;
  139. ; yes, overwrite them (but only the typewriter keys: $01 - $3A, $60)
  140.         move.l  d0,a4           ; get pointer to list of addresses
  141.         moveq   #3-1,d4         ; set loop for 3 tables
  142.         lea     unshift(pc),a1  ; set target adress
  143. ;
  144. next_table:
  145.         move.l  a1,a2
  146.         move.l  (a4)+,a3        ; get next table adress
  147.         move.b  $60(a2),$60(a3) ; first copy the extra key at $60
  148.         addq.l  #1,a3           ; start at $01
  149.         addq.l  #1,a2
  150.         move.w  #$3a-2,d5       ; copy up to $3a
  151. ;
  152. copy:   move.b  (a2)+,(a3)+
  153.         dbra    d5,copy
  154.         adda.l  #$80,a1         ; begin of next table
  155.         dbra    d4,next_table
  156. ;
  157.         move.w  #0,-(sp)        ;normal termination
  158.         trap    #gemdos
  159. ;
  160. ;                               table wasn't in RAM
  161. ;                               now make these tables official
  162. set_pointers:
  163.         pea     capsloc(pc)
  164.         pea     shift(pc)
  165.         pea     unshift(pc)
  166.         move.w  #keytbl,-(sp)
  167.         trap    #xbios
  168.         add.l   #14,sp
  169.                                 ;and cast them in concrete
  170.         pea     exchvec(pc)     ;exchange trap 14 vector
  171.         move.w  #supexec,-(sp)  ;set exception vector
  172.         trap    #xbios
  173.         addq.l  #6,sp
  174. ;
  175.         clr.w   -(sp)
  176.         move.l  #skip-start+$100,-(sp)  ;keep the table and the xbios
  177.                                         ;hack only ($100 for the base page)
  178.         move.w  #keep_process,-(sp)
  179.         trap    #gemdos                 ;stop
  180.      
  181. exchvec: move.l 4*xbiosvec,oldxbios     ;old xbios as jump address
  182.         lea     new_xbios(pc),a0        ;get new xbios address
  183.         move.l  a0,4*xbiosvec           ;and store it in the vector
  184.         rts
  185. ;
  186.         end
  187.